JavaScript的编程风格
在前端工程愈演愈大的情况下,JavaScript占的比例也很足,需要良好的书写风格,才能在多人协作code时提高效率,何况代码还是需要人来读的,所以可读性、可维护性高的代码很多时候有重要意义。
这里推荐下Airbnb的挂在github上的JavaScript编写风格:https://github.com/libertyAlo... 有时间的话,还是希望可以多看看。
eslint
即使我们看了无数遍上面说到的Airbnb的JavaScript的编程风格,但是,不少情况下还是会写出不符合要求的代码,那么就需要工具来约束我们。我们通过配置一些风格,让IDE来强制提醒我们代码的风格是否符合规范,所以eslint就是很好的选择,但是eslint还需要和IDE的结合来使用。
eslint的使用
eslint是一个node的包,需要类似npm、yarm来安装,也和其他的第三方包一样,可以全局安装,也可以本地安装,建议这个全局安装,因为这个包很多时候并不是供编程人员直接使用,而是配合ide或者编辑器来进行使用的,所以全局安装后,可以本地生成配置文件,通过和IDE的配合来起到检测书写风格的效果。
npm install -g eslint
可以安装最新版本,安装好了,考虑哪些工程需要使用eslint来检测,哪些不需要,还有哪些文件需要,哪些文件不需要,甚至文件夹是否需要,在需要的工程根目录下执行
eslint --init
需要配置,可以选择一个流行的风格,Airbnb或者标准,生成JSON文件,.eslintrc.json这个配置文件,
需要注意,win10在git ui的命令窗口执行的话无法使用箭头按键来选择,所以最好还是使用win自带的cmd窗口
这里就可以修改这个json文件,来配置你熟悉的,觉得合理的规则,以及排除的文件,
{
"rules": {
"no-console": 2, // 禁用 console
"no-alert": 2, // 禁用 alert
"no-irregular-whitespace": 2, //禁止tab、空格之外的非法空白
"no-unexpected-multiline": 2, //禁止使用令人困惑的多行表达式,一行结束最后使用;或者是- +之类的连接符
"guard-for-in": 2, // for in 循环必须限制 Object.prototype.hasOwnProperty
"no-caller": 2, //禁用 arguments.caller 或 arguments.callee
"no-extend-native": 2, //禁止扩展原生对象
"no-extra-bind": 2, //禁止不必要的函数绑定 函数中没有使用this时,不需要绑定this
"no-invalid-this": 1, // 控制this的使用,只能在构造函数【首字母大写】、对象、类中使用
"no-multi-spaces": [2, {"ignoreEOLComments": true}], //禁止非缩进处出现多个空格 ,但忽略行尾注释前的多个空格 let a = b; b前空格多了
"no-multi-str": 2, //禁止多行字符串 \ 可以连接多行字符实现换行,建议使用 '\n' +的组合
"no-new-wrappers": 2, //禁止原始包装实例 new String new Number的操作不合理,会变成初始化一个对象,而不是对应的初始类型
"no-throw-literal": 2, //限制可以被抛出的异常 仅仅 抛出(throw) Error 对象本身或者用户自定义的以 Error 对象为基础的异常
"no-with": 2, //不使用with
"no-unused-vars": [2, {"args": "none"}], // 未使用的变量定义,参数不校验,参数有可能是可选参数
"array-bracket-spacing": [2, "never"], //禁止或强制在括号内使用空格, 禁止使用不一致的空格,应该遵守格式 [1, 2, 3],也就是,逗号后面一个空格
"brace-style": 2, //大括号风格要求 one true brace style 风格如下:
/*
if (foo) {
bar();
} else {
baz();
}
*/
"camelcase": [1, {"properties": "never"}], // 驼峰变量命名,警告,而且属性名不会要求是驼峰,变量名要求是
"comma-dangle": [2], //禁止在数组、对象、函数参数最后面添加拖尾逗号
"comma-spacing": 2, // 逗号后非行尾需要加空格
"comma-style": 2, //要求逗号放在数组元素、对象属性或变量声明之后,且在同一行
"computed-property-spacing": 2, //禁止在计算属性中使用空格 obj[key] ok
"eol-last": 2, //要求在非空文件末尾至少存在一行空行
"func-call-spacing": 2, // 函数执行需要紧挨着(括号,alert(1) ok 不要alert (2)
"jsx-quotes": 2, //强制所有不包含双引号的 JSX 属性值使用双引号
"key-spacing": 2, // 对象key之后,冒号前不允许有空格; value前需要有空格
"keyword-spacing": 0, //要求在关键字之前、之后都至少有一个空格
"linebreak-style": 2, //强制使用 Unix 换行符: \n
"new-cap": 2, //要求构造函数首字母大写
"newline-after-var": 1, // 变量定义后增加空行 warn
"no-array-constructor": 2, // new Array X 禁用 Array 构造函数
"no-mixed-spaces-and-tabs": 2, // 禁止混用tab与空格 禁止空格和 tab 的混合缩进
"no-multiple-empty-lines": [2, {"max": 2}], // 不能有多个空行,最多两行
"no-new-object": 2, //禁用 Object 的构造函数
"no-trailing-spaces": 2, // 行尾不留空格
"object-curly-spacing": 2, //不允许花括号中有空格
"one-var-declaration-per-line": 2, // 一个var定义多个变量时每个变量必须换行
"padded-blocks": [2, "never"], // 其中一条:{}内第一行与最后一行不允许有空行
"quote-props": [2, "consistent"], //对象的属性名需要统一【 双引号、单引号、不加】三个选一
"quotes": [2, "single", {"allowTemplateLiterals": true}],
"semi-spacing": 2, // 分号前不加空格
"semi": 2, // 该有分号的地方都加分号
// "sort-keys": 1, //对象的键名需要按照字典序排序
// "sort-vars": 1, //变量定义按照字典序排序
"space-before-blocks": 2, // {} 前必须有空格,例如 function() {}
"space-before-function-paren": [2, "never"], // function 参数前不允许有空格
"spaced-comment": [2, "always"], // 注释后面//后需要增加空格
"arrow-parens": [2, "always"], // 要求箭头函数的参数使用圆括号
"constructor-super": 2, // 派生类中的构造函数必须调用 super()。非派生类的构造函数不能调用 super()。[字面量继承其他类的类就是派生类]
"generator-star-spacing": [2, "after"], // 约束 generator 函数强制在 * 和函数名之间有空格
"no-new-symbol": 2, // disallow new operators with the Symbol object 不要new symbol
"no-this-before-super": 2, // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
//"no-var": 1, // 要求使用 let 或 const 而不是 var
//"prefer-rest-params": 1, // require rest parameters instead of arguments
"prefer-spread": 2, // 要求使用扩展运算符而非 .apply() ,参数在一个数组中时
"rest-spread-spacing": 2, // rest参数、扩展运算符 和其对应的表达式都不能有空格 ...args
"yield-star-spacing": [2, "after"], // 强制在 * 和 参数之间有空格 yield* other();
"no-debugger": "error", // 禁用 debugger
"no-sequences": "error", // 禁用逗号操作符
"no-dupe-args": "error", // 禁止 function 定义中出现重名参数
"no-inner-declarations": "error", // 禁止在嵌套的块中出现 function 声明 ;if等块中声明函数
"no-unreachable": "error", // 禁止在return、throw、continue 和 break 语句之后出现不可达代码
"no-octal": "error", // 禁用八进制字面量 0开头的数字
"no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
"block-scoped-var": 2, // if,for内无var定义,可以用let // 强制把变量的使用限制在其定义的作用域范围内
"indent": [2, 4, {
"SwitchCase": 1
}], // 统一缩进4字符,switch case需要缩进
"max-nested-callbacks": [2, 5], // 强制回调函数最大嵌套深度 5层
}
}
可能还需要一个排除检测文件,和.eslintrc.json同级的目录下面新建一个文件,名字为: .eslintignore
下面是element ui的排除文件
src/utils/popper.js
src/utils/date.js
*.sh
node_modules
lib
coverage
很多时候其实我们的工程都是在已有的基础上进行改进的,所以我们可能只是在新增加的代码上面进行eslint
校验就好:那么就需要.eslintignore
的书写只包含某个文件夹
/*
!/src
/src/*
!/src/page
/src/page/*
!/src/page/flist
上面就是只检查.eslintignore
同级下的src/page/flist
这个文件夹。这个.eslintignore
和gitignore
是一样的规则,
gitignore规则描述
到这里其实还是差一些,安装了这个eslint的包,生产了配置文件,还需要ide挥着编辑器的配合,所以本文说的是vscode。
vscode+eslint
vscode是一个微软开源的编辑器,很多插件可以辅助,这个eslint就是一个插件,安装eslint插件,安装插件后,会检测打开的工程是否存在一个eslint的配置文件,存在的话就会执行eslint的检测,不存在的话就不会检测。
react+eslint有个问题,react的组件引入时会被认为没有被使用no-unused-vars
,需要引入react
插件,引入规则"react/jsx-uses-vars": 2
对于react
的使用,一些无状态的组件虽然没有显示的调用react
,但是编译后会使用React.createElement
来构造组件,所以还是会出现react
没有被使用no-unused-vars
,只能通过注释来消除
/* eslint-disable */ 整个下面块不检查
// eslint-disable-next-line 下一行不检查
import React, {Component} from 'react'; // eslint-disable-line 本行不检查
完整的编写:
{
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaFeatures": {
"experimentalObjectRestSpread": true,
"jsx": true
},
"sourceType": "module"
},
"plugins": [
"react"
],
"rules": {
"no-cond-assign": 0,
"no-console": 2,
"no-alert": 2,
"no-irregular-whitespace": 2,
"no-unexpected-multiline": 2,
"guard-for-in": 2,
"no-caller": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-invalid-this": 1,
"no-multi-spaces": 2,
"no-multi-str": 2,
"no-new-wrappers": 2,
"no-throw-literal": 2,
"no-with": 2,
"no-unused-vars": [2, {"args": "none"}],
"react/jsx-uses-vars": 2,
"array-bracket-spacing": [2, "never"],
"brace-style": 2,
"comma-dangle": [2],
"comma-spacing": 2,
"comma-style": 2,
"computed-property-spacing": 2,
"func-call-spacing": 2,
"jsx-quotes": 2,
"key-spacing": 2,
"keyword-spacing": 0,
"linebreak-style": 2,
"new-cap": 2,
"no-array-constructor": 2,
"no-mixed-spaces-and-tabs": 2,
"no-multiple-empty-lines": [2, {"max": 2}],
"no-new-object": 2,
"no-tabs": 0,
"no-trailing-spaces": 2,
"object-curly-spacing": 2,
"padded-blocks": [2, "never"],
"quote-props": [2, "consistent"],
"quotes": [2, "single", {"allowTemplateLiterals": true}],
"semi-spacing": 2,
"semi": 2,
"space-before-blocks": 2,
"space-before-function-paren": [2, "never"],
"spaced-comment": [2, "always"],
"constructor-super": 2,
"generator-star-spacing": [2, "after"],
"no-new-symbol": 2,
"no-this-before-super": 2,
"no-var": 1,
"prefer-rest-params": 1,
"prefer-spread": 2,
"rest-spread-spacing": 2,
"yield-star-spacing": [2, "after"],
"no-debugger": "error",
"no-sequences": "error",
"no-dupe-args": "error",
"no-inner-declarations": "error",
"no-unreachable": "error",
"no-octal": "error",
"no-dupe-keys": "error",
"block-scoped-var": 2,
"indent": [2, 4, {
"SwitchCase": 1
}],
"max-nested-callbacks": [2, 5]
}
}
使用vscode
的时候,有的时候使用脚手架生成的代码缩进会是2个空格,大部分时间我们可能需要4个空格,所以在首选项里面可以设置,不检查代码的缩进,不管什么情况都是用4空格缩进,"editor.tabSize": 4,"editor.detectIndentation": false
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。